package com.tfjybj.itoo.exam.provider.service;

import com.dmsdbj.itoo.tool.base.service.BaseServicePlus;
import com.dmsdbj.itoo.tool.business.ItooResult;
import com.github.pagehelper.PageInfo;
import com.tfjybj.itoo.exam.entity.ExamRoomEntity;
import com.tfjybj.itoo.exam.entity.ExamineeEntity;
import com.tfjybj.itoo.exam.model.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;


/**
 * ExamineeService接口
 * examinee表
 *
 * @author 任晓帅
 * @version 2.0.0
 * @since 2.0.0 2018-11-15 19:40:28
 */
public interface ExamineeService extends BaseServicePlus<ExamineeEntity> {

    //region 模板生成：模糊查询

    /**
     * 根据学生姓名模糊查询examinee
     *
     * @param studentName 学生姓名
     * @param pageNo      页码 Integer
     * @param pageSize    页数 Integer
     * @return 模糊查询的examinee
     * @author 任晓帅
     * @since 2.0.0 2018-11-15 19:40:28
     */
    PageInfo<ExamineeEntity> queryByLikeStudentName(String studentName, Integer pageNo, Integer pageSize);


    //endregion

    /* **********************************以下为非模板生成的内容********************************* */


    /**
     * 根据学生姓名模糊查询考生信息
     *
     * @param studentName
     * @return 班级本场考试所有成绩
     * @authror 谢妞
     * @since 2018年12月14日19:23:16
     */
    List<ExaminationModel> queryExamineLikeName(String studentName, String classId, String examId);

    /**
     * 根据考试班级ID和考试ID分页查询考生-已经完成
     *
     * @param classId
     * @param examId
     * @author 谢妞
     * @since 2018-11-24
     */
    List<ExaminationModel> queryPageExamineeByClassId(String classId, String examId);


    /**
     * 根据班级id和考试id批量导出班级所有学生成绩
     *
     * @param response
     * @param exportList
     * @return 班级本场考试所有成绩
     * @authror 谢妞
     * @since 2018年12月14日19:23:16
     */
    ItooResult exportComplexByClassIdExamId(HttpServletResponse response, List<ExaminationModel> exportList);

    /**
     * 用于批量导出的查询
     */
    List<ExaminationModel> queryExamineeInfo(List<ExaminationModel> exportList);

    /**
     * 根据班级ID查询并导出考生成绩
     * 谢妞-2018-11-26
     */
    List<ExaminationModel> queryExamineByClassIdNoPpage(String classId, String examId);

    /**
     * 导出单个班级的成绩信息
     *
     * @param classId
     * @param examId
     * @author 谢妞
     * @since 2018-11-28
     */
    ItooResult exportSingleScore(HttpServletResponse response, String classId, String examId);


    /**
     * 根据考试ID和考场ID查询考场下所有学生
     *
     * @param examId,examRoomId
     * @return ExamineeReachClassModel
     * @author 任晓帅
     * @since 2.0.0      2019年5月21日15:20:45
     */
    List<ExamineeReachClassModel> queryExamStudent(String examId, String examRoomId);

    /**
     * 查询当前考场下所有缺考学生
     *
     * @param examId examRoomId
     * @return ExamineeReachClassModel
     * @author 王雪芬 任晓帅
     * @since 2.0.0        2018-11-19 12:16:03  2019年5月21日17:14:04
     */
    List<ExamineeModel> queryExamStudentNologin(String examId, String examRoomId);

    /**
     * @param examId String
     * @return 根据考试id查出本场考试所有考生
     * @author maying
     * @since 2018年11月17日11:18:04
     */
    List<ExamineeModel> selAllExaminee(String examId);

    /**
     * @param examId String
     * @return 根据考试id删除本场考试所有考生
     * @author maying
     * @since 2018年11月18日10:12:23
     */
    int arrayDelExaminee(String examId);

    /**
     * 添加学生
     *
     * @param examineeModel ExamineeModel
     * @return 添加的结果
     * @author maying
     * @since 2018-11-22 15:51:29
     */
    boolean insertExaminee(ExamineeModel examineeModel);


    /**
     * 查询安排考生-用于简要考试
     *
     * @param studentId 学号
     * @return 学生信息
     * @author 王雪芬
     * @since 2018-11-23 15:51:29
     */
    List<ExamineeEntity> queryExamStudentExaminee(String studentId, String exameeId);

    /**
     * 根据考试id查询查询课程信息
     *
     * @param examId
     * @return
     * @author maying
     * @since 2018-11-27 21:29:42
     */
    List<ClassModel> selExamClass(String examId);

    ExamineeEntity queryExamExamineeInfo(String examineeId);

    /**
     * 根据考试低查询考试下面所有的考生
     *
     * @param examinationId 考试id
     * @return 考生集合
     * @author 马莹
     * @since 2018-12-29 21:25:34
     */
    List<ExamineeModel> selNotExamStudentInfo(String examinationId);

    /**
     * 根据学号或姓名查询考生-模糊查询(考试信息管理)
     *
     * @author maying
     * @since 2018-12-11 10:14:16
     */
    List<ExamineeModel> fuzzyQuery(String examineeName, String examinationId);


    /**
     * 根据班级集合查询这个班级集合下面所有的学生
     *
     * @param classList   班级集合
     * @param examationId 考试id
     * @param operatorId  操作人id
     * @param fuzzyValue  模糊查询条件
     * @return 学生集合以班级为单位
     * @since 2018-12-22 11:08:12
     * author 马莹
     */
    List<ExamineeModel> selectStudentList(List<String> classList, String examationId, String operatorId, String fuzzyValue);


    /**
     * 根据考试id更新考试时长
     *
     * @param examId       考试id
     * @param examDuration 考试时长
     * @author 马莹
     * @since 2018-12-24 20:26:26
     */
    boolean updateExamineeInfomation(String examId, Integer examDuration);

    /**
     * 查询第二次登陆考试时间理论结束时间
     *
     * @param
     * @author 王雪芬
     * @since 2018-12-21 15:07:17
     */
    List<ExamineeEntity> queryExamStudentEndTime(String studentId);


    /**
     * 当前考试的考生
     *
     * @param studentId
     * @return
     */
    List<ExaminOnlineModel> queryExamExaminee(String studentId);


    /**
     * 根据学生id查询差生信息,以及考试信息
     *
     * @param beginTime 考试开始时间
     * @param studentId 学生id
     * @param overTime  考试结束时间
     * @return 冲突考试的集合
     * @author 马莹
     * @since 2018-12-28 21:38:44
     */
    List<ExaminationModel> selectExaminee(String beginTime, String overTime, String studentId);

    /**
     * 查询考场总人数
     *
     * @param examRoomId
     * @return
     * @author 于云秀
     * @since 2018年12月29日10:33:40
     */
    List<ExamineeEntity> selExamRoomStudentCount(String examRoomId, String examId);

    /**
     * 通过考试id查询获取考场的个数
     *
     * @param examId 考试id
     * @return 考场的集合
     * @author 马莹
     * @since 2019-1-3 20:24:13
     */
    List<ExamRoomEntity> selectExamineeInExamRoom(String examId);

    /**
     * 根据考试id查询考试的考生人数
     *
     * @param examId 考试id
     * @return 考生集合
     * @author 马莹
     * @since 2019-1-3 20:41:03
     */
    List<ExamineeModel> selectCountExaminee(String examId);

    /**
     * 找出考试时间结束但是考生状态为1的学生
     *
     * @return 考生集合
     * @author 王雪芬
     * @since 2019-1-3 20:41:03
     */
    List<ExamineeEntity> examOnlineExamineeState();

    /**
     * 更新考生状态为3
     *
     * @return 考生集合
     * @author 王雪芬
     * @since 2019-1-3 20:41:03
     */
    int updateExamineeStatus(List<ExamineeEntity> examineeEntityList);

    /**
     * 导出Excel表格,分sheet,自定义表头
     *
     * @param examIdList 考试集合
     * @param request
     * @param response   @author 马莹
     * @since 2019-1-6 14:47:46
     */
    void customExportExcel(List<String> examIdList, HttpServletRequest request, HttpServletResponse response);


    /**
     * 导出学生班级成绩
     * 谢妞-2018-11-24
     */
    int ifSummaryScore(String examId, String classId);

    /**
     * 根据考试id校验人数
     *
     * @param operator
     * @return
     * @author 谢妞
     */
    List<ExaminationModel> checkExamine(String operator);

    /**
     * 根据教师id查看缺考信息
     *
     * @param operator
     * @author 谢妞
     * @since 2019年1月22日16:07:19
     */
    List<ExaminationModel> checkLack(String operator);

    /**
     * 根据教师id查看没有成绩的学生
     *
     * @param operator
     * @author 谢妞
     * @since 2019年1月22日16:38:03
     */
    List<ExaminationModel> checkNoScore(String operator, Integer type);

    /**
     * 根据考生id和班级id查询各章节得分率60%以上人数
     *
     * @param classId
     * @param examId
     * @author 孙博雅
     * @sinces 2019年3月3日19:34:14
     */
    List<ExaminationModel> querychapternumbe(String classId, String examId, String examineeId);

    /**
     * 根据班级id和考试id查询考生id
     *
     * @param classId
     * @param examId
     * @author 孙博雅
     * @sinces 2019年3月3日19:34:14
     */
    List<ExaminationModel> queryStudent(String classId, String examId);

    /**
     * 根据考试开始时间查询这个时间点有考试的考生
     *
     * @param examStartTime 考试开始时间
     * @return 考生集合
     * @author 马莹
     * @since 2019-3-28 19:48:21
     */
    List<ExamineeModel> queryExaminee(String examStartTime);


    List<ExamineeModel> queryChapterNumbe(String examinationId, String classId);

    /**
     * 根据考试的开始时间和结束时间查询考生(没有controller,上一层是ExamRoomServiceImp中)
     *
     * @param startTime 考试开始时间
     * @param endTime   考试结束时间
     * @return 符合条件的考生集合
     * @author 马莹
     * @since 2019-5-5 17:30:57
     */
    List<ExamineeModel> queryMeetConditionExaminnee(Date startTime, Date endTime);

    /**
     * 根据考生id和班级id查询学生章节具体分数
     *
     * @param classId
     * @param examId
     * @author a孙博雅
     * @sinces 2019年3月16日20:43:36
     */
    List<ExaminationModel> querychapterscore(String classId, String examId, String examineeId);

    ExaminationModel selectTotalScore(String classId, String examId, String examineeId);

    /**
     * 根据考试班级ID和考试ID分页查询考生
     *
     * @param classId 班级ID
     * @param examId  考试ID
     * @author 孙博雅
     * @since 2019年4月18日
     */
    List<ExaminationModel> queryPageExamineeByClassIdsby(String classId, String examId);

    /**
     * 根据考试id和学生id查询是否存在本场考试
     *
     * @param stuId  学生id
     * @param examId 考试id
     * @return 考生集合
     * @author 马莹
     * @since 2019-6-29 11:24:04
     */
    Integer queryStuInExam(String stuId, String examId);
}
